#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QLabel>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //只是将我们的信号和槽函数建立链接，但是还没有触发
    //connect(this, &Widget::mySignal1, this, &Widget::handleMySignal);
    //发送出自定义信号，也可以发送QT内置信号
    //emit mySignal();
    //connect(this, &Widget::mySignal2, this, &Widget::myslot2);

    //connect(const QObject* sender, const char* signal, const QObject* reciver, const char* method)
    //其实还有第四个参数，这里暂时不做考虑
    QPushButton* button = new QPushButton(this);
    button->setText("关闭");
    button->move(0, 0);
    connect(button, &QPushButton::clicked, this, &Widget::on_button_clicked);

    // Widget::close，widget中内嵌的槽函数。
    // 从QT5开始，第二个和第四个参数成了泛型参数，允许传入任意类型的指针
    // 如果传入的第二、四个参数的函数指针不分别是第一、二个成员函数，此时代码编译报错
    // connect(button, &QPushButton::clicked, this, &Widget::on_button_clicked);
    // 第二种自定义槽函数的方式：
    // 在widget.ui中点击组件，查看转到槽，查看其及其父类的所有信号
    // 通过on_name_signal的函数命名方式可以直接进行链接的工作

    /////////////自定义信号//////////////
    //1.是一类非常特殊的函数，程序员只需要告诉Qt这是一个信号即可，这个函数
    //的定义是由Qt在编译时实现的
    //2.返回值必须是void，有没有参数都可以，甚至可以支持重载

    //////QT槽函数的设想//////
    /// 1.解耦合，把触发用户操作的控件和处理用户对应的操作逻辑建立关系
    /// 2.多对多，一个信号可以与多个槽函数建立链接（实体与实体之间建立关系）
    /// 一个槽函数也可以被多个信号调用
}

void Widget::handleClicked()
{
    //第一种自定义槽函数的方式
    this->setWindowTitle("按钮已经按下");
}

void Widget::handleMySignal() //信号函数和槽函数的参数类型（如果有的话）类型必须一致，但是数量可以不一样
{
    //信号的参数多于信号槽函数的参数是没有问题的，为了让槽能方便的绑定到一起
    //槽函数使用信号传递的前n个参数
    this->close();
}

void Widget::on_button_clicked()
{
    emit mySignal2();
    qDebug() << "on_button_clicked operated";
    this->close();
}

void Widget::myslot2()
{
    qDebug() << "myslot2 operated";
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    // 现在其实不写emit也不影响发送自定义信号
    emit mySignal1(20);
}
